package com.ft.scan.common;

import org.apache.commons.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author: 幻屹
 * @time: 2024/4/17
 * @destination: pdf文件和Base64字符串相互转换
 */

public class PdfUtil {
    /**
     * 将PDF文件转换为Base64字符串
     *
     * @param pdfFilename: pdf文件的名字
     * @return Base64字符串
     */
    public static String convertPdfToBase64Str(String pdfFilename) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            // 加载 PDF 文档
            PDDocument document = PDDocument.load(new File(pdfFilename));

            // 将 PDF 转换为字节数组
            document.save(baos);
            byte[] pdfBytes = baos.toByteArray();

            // 关闭 PDF 文档
            document.close();

            // 将字节数组转换为 Base64 编码的字符串
            return Base64.getEncoder().encodeToString(pdfBytes);
//            return pdfBytes;

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭字节数组输出流
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 将Base64字符串转换为PDF文件
     *
     * @param base64Str: Base64字符串
     * @return PDF文件
     */
    public static void convertBase64ToPdf(String base64Str) {

        // 使用 ZipInputStream 解压缩字节数组中的数据
        ByteArrayInputStream bis = null;
        ZipInputStream zis = null;

        try {
            // 将 Base64 编码的字符串转换为字节数组
            byte[] pdfBytes = Base64.getDecoder().decode(base64Str);

            bis = new ByteArrayInputStream(pdfBytes);
            zis = new ZipInputStream(bis);

            // 读取解压缩后的文件内容
            ZipEntry entry = zis.getNextEntry();
            while (entry != null) {
                // 判断是否是文件，而不是目录
                if (!entry.isDirectory()) {
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();

                    // 将 zis 中的数据复制到 bos 中
                    IOUtils.copy(zis, bos);

                    // 将 bos 中的数据转换为字节数组
                    byte[] fileBytes = bos.toByteArray();

                }
                // 关闭当前 ZipEntry
                zis.closeEntry();
                // 获取下一个 ZipEntry
                entry = zis.getNextEntry();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bis != null) {
                    bis.close();
                }
                if (zis != null) {
                    zis.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

//        // 创建一个临时文件来保存转换后的 PDF 文件
//        ByteArrayInputStream bis = new ByteArrayInputStream(pdfBytes);
//
//        try {
//            // 加载 PDF 文件
//            PDDocument document = PDDocument.load(bis);
//
//            // 保存 PDF 文件
//            document.save(new File("result.pdf"));
//
//            // 关闭 PDF 文件
//            document.close();
//        }catch (Exception e) {
//            e.printStackTrace();
//        }finally {
//            try {
//                // 关闭字节数组输入流
//                bis.close();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }

    }
}
